//临时修改了141行和134行
window.onload=function(){
    //初始化数据
    audios=this.document.getElementsByName("audio");
    anyWay=0;//默认解析模式
    wavWay=4;//默认乐器模式
    delayDefault=10;//默认的延迟
    f5WavTip();
    f5AnyTip();
}
var audios=null;
var anyWay=0;//解析方式
var wavWay=0;//当前音效的模式
var maxAny=2;//除了原模式之外，存在几种解析方式
var maxWav=4;//除了原音效，存在几种音效
var logPrint=false;//是否打印日志
var delayDefault=10;//默认的延迟
var anyData="";//解析后的数据
var tag=false;//标记，用于记录是否是带有设置延时
var volume=true;//浏览器音量
var removeText=true;//清除文本框的内容
/**
 * 渐渐消失动画效果
 * @param {Element} e div元素
 */
function dieOut(e) {
    e.style.backgroundColor="blanchedalmond";
    if (e.innerHTML!="" || e.innerHTML!="undefined") {
        e.innerHTML=window.clearInterval(e.innerHTML);
    }
    let index = 100;
    e.innerHTML=window.setInterval(function(){
        if (index<0) {
            e.style.backgroundColor="rgba(255,235,205,0)";
            e.innerHTML=window.clearInterval(e.innerHTML);
        } else {
            e.style.backgroundColor="rgba(255,235,205, "+index/100+")";/*设置透明度*/
            index-=5;
        }
    },20);
}

//入口，启动, 解析
function start() {
    if(logPrint) console.log("开始执行...");
    tag=false;//修复一次添加前后缀之后每次都一定会添加后缀
    let datas=document.getElementById("data").value;
    if (anyWay==1) {//当前模式等于1则执行该解析方式
        datas=(scoreAny(datas));
    } else if (anyWay==2) {//当前模式等于2则执行该解析方式
        datas=(LiPuAny(datas));
    } else {//其它均执行默认方式 
        let startLength=datas.indexOf("{");
        if (startLength>-1) {//是否配置延迟,检测是否存在 { 符号
            let endLength=datas.indexOf("}");
            if (endLength<0) {//给末尾添加 }
                datas+="}";
            }
            datas = eval('(' + datas + ')')//截取{}之间的数据作为对象使用
            if (datas.hasOwnProperty("delay")) {//查询该属性是否存在
                delayDefault=datas.delay;
            }
            document.getElementById("delay").value=delayDefault;//刷新页面默认延迟时间
            tag=true;//将标记设置成true
            anyData="{\"delay\":\"250\",\"musicData\":\"";//添加前缀，后缀在赋值之前添加，在187行
            datas=datas.musicData;
        }
        datas=datas;//获取数据
    }
    datas=datas.split(/\s+/);//切割数据成数组
    if(logPrint) console.log("最终数据："+datas);
    analysis(datas);
    if(logPrint) console.log("执行结束");
}
/**
 * 解析score文件格式
 * @param {Strign} scoreData 完整的score文件数据
 */
function scoreAny(scoreData) {
    scoreData=(scoreData.split("|")[2]);//读取原数据
    // console.log("原数据："+scoreData);
    var score = eval('(' + scoreData + ')').score;//解析出score对象
    // console.log("score对象：");
    // console.log(score);//不能和上面的连接在一起，不然会不打印部分数据
    scoreData="";
    score.forEach((e)=>{
        //保存按键
        var tempStr="";//临时字符串
        e.pitches.forEach((pitches)=>{
            if(pitches.indexOf(":")>-1){
                if(pitches=="1::"){//高音转换
                    tempStr+="15";//将1::的数据变成15，也就是高音1
                } else if(pitches=="-"){//延迟走这路
                    if(logPrint) console.log("延迟");//艹？打个日志就修完了？
                } else {//中音转换
                    tempStr+=(parseInt(pitches)+7);//将有冒号的数据加7转变成中音，后面加 "" 只是为了让它变成字符串
                }
            } else {//不是中音/高音时执行这里
                tempStr+=pitches;
            }
            tempStr+=",";//添加分号，在后面会删除
        });
        scoreData+=tempStr.substring(0,tempStr.length-1)+" ";//保存数据，将末尾的逗号删除、添加空格并追加到数据中
        //保存延迟
        var tempDelay=0;
        if(e.duration.indexOf("+")){
            e.duration.split("+").forEach((e)=>{tempDelay+=parseInt(e);});//设置延迟时长          
        } 
        scoreData+=( (32 / tempDelay) * 60)+"ms ";//保存延迟(时长)
    });
    return scoreData;
}
/**
 * 解析离谱文件格式
 * @param {Strign} scoreData 完整的离谱js文件数据
 */
function LiPuAny(scoreData) {
    let funArray=["A1","A2","A3","A4","A5","A6","A7"
                 ,"B1","B2","B3","B4","B5","B6","B7","C1"]
    scoreData=scoreData.substring(scoreData.lastIndexOf("press"));
    scoreData=scoreData.split("\n");
    let musicData="";
    scoreData.forEach(e => {
        e=e.substring(0,e.indexOf(")")+1);//临时添加，为了解析离谱最新版的改动
        if (e.length<8) {//判断是哪个音
            for (let i = 0; i < funArray.length; i++) {//遍历所有音
                if (e.indexOf(funArray[i])!=-1) {//判断是否存在这个音
                    musicData+=(i+1)+" ";
                }
            }
        } else if(e.indexOf("sleep")>-1){//判断是不是延迟
            musicData+=parseInt(e.substring(e.indexOf("(")+1,e.indexOf(")")))+"ms ";//临时修改 使用parseInt获取数值
        } else{//以上均未调用时
            console.log("未定义的数据："+e);
        }
    });
    return musicData;
}

/**
 * 解析数据，并调用函数来执行，传值，给函数自己解析
 * @param {Array} dataArray 数字数组，其它数据全部不执行，默认10ms延迟
 */
function analysis(dataArray) {
    if (Array.isArray(dataArray)) {
        if (dataArray.length>1) {//长度大于1时才执行，空值时会切割出一个空值，长度为1，所以大于1时才执行
            let i = 0;       //遍历用
            let timeID=null; //定时器id
            let str="";      //临时字符串
            let startDelay=0;//起始延迟
            let delayTotal=0;//总共延迟
            timeID=setInterval(function(){
                startDelay+=delayDefault;//每次计算都会加默认延迟
                if (i < dataArray.length) {//遍历是否结束
                    str=dataArray[i].toString();
                    if(logPrint) console.log("定时："+delayTotal+"ms"); 
                    if (str.length <= 2) {
                        //判断当前数据是否合法  不为空 &&小于16 &&大于0
                        if (str!="" && str<=16 && str>0) {
                            let a=str;//每一次重新创建一个局部变量，否则会调用错误
                            anyData+=" "+str;//将数据添加到解析数据中
                            setTimeout(function(){run(a);},delayTotal);
                        }
                    }else {
                        if (str.substring(str.length-2)=="ms") {//判断是否是等待等待 parseInt()let 
                            str=str.substring(0,str.length-2);
                            anyData+=" "+str+"ms";//将数据添加到解析数据中
                            delayTotal+=parseInt(str);
                        }else if(dataArray[i].split(/[,，]/).length>1) {//需要同时点击的部分，目前采用的方案是无延迟点击
                            var t=dataArray[i].split(/[,，]/);
                            if(logPrint) console.log("多点触碰"+t);
                            anyData+=" "+t;//将数据添加到解析数据中
                            for(var j=0; j<t.length;j++){//循环执行，无延迟，可能超边界
                                //判断当前数据是否合法  不为空 &&小于16 &&大于0  
                                if (t[j]!="" && t[j]<=16 && t[j]>0) {
                                    let tempNum=t[j];//每次创建一个局域变量，这样不会在t数组变换时定时器无效
                                    setTimeout(function(){run(tempNum);},delayTotal);//调用函数，传当前数据 
                                }
                            }
                        }
                    }
                    i++;//遍历自增长
                } else {//关闭定时器,退出
                    if (tag) {//是否添加后缀
                        anyData+="\"}";//添加后缀，前缀在 71行添加
                    }
                    document.getElementById("anyData").value=anyData;//将解析结果放在网页上
                    anyData="";//清空该数据
                    timeID=window.clearInterval(timeID);//关闭定时器
                    //为用户提示本次时长
                    delayTotal-=startDelay;//减去已经使用的时间
                    document.getElementById("start").value="时长："+parseInt(delayTotal/1000)+"s";
                    timeID=setInterval(function(){
                        delayTotal-=1000;//每次减1秒
                        document.getElementById("start").value="时长："+parseInt(delayTotal/1000)+"s";
                        if (delayTotal<0) {
                            document.getElementById("start").value="启动";
                            timeID=window.clearInterval(timeID);//时间小于0之后关闭定时器
                        }
                    },1000);//每秒刷新一次
                }
            },delayDefault);//每隔 delayDefault 毫秒才计算一次
        }else{
            console.log("空数组");
        }
    }else{
        console.log("传入的对象不是数组"+dataArray);
    }
}

/**
 * 函数实体，执行操作
 * @param {int} key 范围在1-15之间（包含1和15）
 */
function run(key) {    
    if(key==undefined) return false;//多点触控越界，取消操作
    switch (key.toString()) {
        case  "1":    document.getElementById("m1").click();  break;//当数值为1时，执行该内容
        case  "2":    document.getElementById("m2").click();  break;
        case  "3":    document.getElementById("m3").click();  break;
        case  "4":    document.getElementById("m4").click();  break;
        case  "5":    document.getElementById("m5").click();  break;
        case  "6":    document.getElementById("m6").click();  break;
        case  "7":    document.getElementById("m7").click();  break;
        case  "8":    document.getElementById("m8").click();  break;
        case  "9":    document.getElementById("m9").click();  break;
        case "10":    document.getElementById("m10").click(); break;
        case "11":    document.getElementById("m11").click(); break;
        case "12":    document.getElementById("m12").click(); break;
        case "13":    document.getElementById("m13").click(); break;
        case "14":    document.getElementById("m14").click(); break;
        case "15":    document.getElementById("m15").click(); break;
        default:if(logPrint) console.log("默认操作...未进行任何操作");break;
    }
}
/**
 * 执行点击和播放音频
 * @param {Element} Element 按键对应的div
 */
function exec(Element) {
    let audio = document.getElementById("a"+Element.id);
    audio.currentTime = 0;
    audio.play();
    dieOut(Element);
}
/**
 * 改变解析模式
 */
function changeAny() {
    if (anyWay<0 || anyWay>=maxAny) {
        anyWay=0;
    } else {
        anyWay++;
    }
    f5AnyTip();
}
function f5AnyTip() {//刷新解析模式的提示语句
    let str="";
    switch (anyWay) {
        case 1: str="score模式，识别score文件的格式";break;
        case 2: str="LiPu模式，识别离谱js文件的格式";break;
        default:str="普通模式，识别自己的格式";break;
    }
    document.getElementById("anyTip").innerText=str;
}
/**
 * 改变音效
 */
function changeWav() {
    if (wavWay<0 || wavWay>=maxWav) {
        wavWay=0;
    } else {
        wavWay++;
    }
    let audios=document.getElementById("wavPlayer").getElementsByTagName("audio");
    for (let i = 0; i < audios.length; i++) {//中断全部播放中的音频
        if (!audios[i].paused) {//如果当前的音频正在播放，则将音频停止
            audios[i].pause();
        }
    }
    f5WavTip();
}
function f5WavTip() {//刷新音乐文件
    let str="";
    let name="";//文件夹名字
    switch (wavWay) {
        case 1: name="harp1"; str="竖琴模式<br>&nbsp;&nbsp;&nbsp;&nbsp;——来自 游戏内录制，存在杂音";break;
        case 2: name="piano1"; str="钢琴模式<br>&nbsp;&nbsp;&nbsp;&nbsp;——来自 游戏内录制，存在杂音";break;
        case 3: name="piano"; str="钢琴模式<br>&nbsp;&nbsp;&nbsp;&nbsp;——来自 @𓇼（884593935） 大佬的音效";break;
        case 4: name="piano2"; str="钢琴模式<br>&nbsp;&nbsp;&nbsp;&nbsp;——来自 @404（690818882） 大佬的游戏包中提取的音效";break;
        default:name="default"; str="默认模式<br>&nbsp;&nbsp;&nbsp;&nbsp;——来自 @404 大佬的音效";break;
    }

    //修改音乐文件路径
    let audios=document.getElementById("wavPlayer").getElementsByTagName("audio");
    let len=audios[0].src.indexOf("wav_")+4;//找到 "wav_"的下标位置并加上本身占用的长度，后面直接修改即可
    let prefix=audios[0].src.substring(0,len);//获取前缀
    for (let i = 0; i < audios.length; i++) {//遍历修改路径名
        audios[i].src=prefix+name/*修改的地方*/
                     +audios[i].src.substring(audios[i].src.lastIndexOf("/"))/*后缀*/;
    }
    document.getElementById("wavTip").innerHTML=str;
    //loadingWav();
}
/**
 * 
 * @param {Int} delay 
 * @param {Function} fun 
 */
function sleep(delay, fun) {
    let int=window.setInterval(function(){
        fun();//执行函数
        clearInterval(int);//关闭定时器
    },delay);
}
/**
 * 循环 每delay时间后执行fun函数，循环完毕执行startFun函数
 * @param {Int} delay       每次循环等待时间
 * @param {Int} startNum    起始数值
 * @param {Int} endNum      结束数值
 * @param {Int} addNum      步长，每次增加，每次循环起始数值要增加的数
 * @param {Function} fun    循环函数，每次循环要执行的函数
 * @param {Function} startFun 后续函数，当循环函数执行完毕之后执行该函数
 */
function sleepFor(delay,startNum,endNum,addNum,fun,startFun) {
    //定时运行
    let int=window.setInterval(function(){
        if (startNum<endNum) {//判断是否运行
            fun();//执行函数
            startNum+=addNum;//步长增加
        } else {
            startFun();//执行后续函数
            clearInterval(int);//关闭定时器
        }
    },delay);
}
/**
 * 从文件中读取数据并且添加到输入框 textarea 中
 * @param {File} file 要读取的文件
 */
function readFile(file) {
    let t=document.getElementById("fileTip");
    if (file != undefined) {//传入的文件不为空
        t.innerText="读取中...";//给用户提示
        let read = new FileReader();
        read.readAsText(file, "UTF-8");//读取文件
        read.onload = function(ProgressEvent){ //读取完文件之后会回来这里
            t.innerText="读取完成";//给用户提示
            if(removeText) document.getElementById("data").value="";//清空文本框
            document.getElementById("data").value+=ProgressEvent.target.result;//将读取到的文件内容追加到编辑框中
            setTimeout(function(){t.innerText="";},3000);//在3秒后清除提示
        }
    } else {
        t.innerText="文件不存在!";//给用户提示
    }
}
/**
 * 判断是否存在文件
 */
function isFile() {
    let file=document.getElementById("fileId");
    if (file.value == "") {
        document.getElementById("fileTip").innerText="没有文件";
    } else {
        readFile(file.files[0]);//读取第一个文件
    }
    setTimeout(function(){  document.getElementById("fileTip").innerText="" },3000);
}
function setDelay(){//设置每次点击的默认延迟
    let inputDelay = document.getElementById("delay");
    delayDefault=inputDelay.value;
    inputDelay.value=delayDefault;
}
/**
 * 加载音频
 */
/*function loadingWav() {
    setVolumeNum(true);
    for (let i = 1; i < 16; i++) {
        run(i);
    }
    setTimeout(function(){setVolumeNum(false);},3000);
}*/
function setVolumeNum(param) {
    let audios=document.getElementById("wavPlayer").getElementsByTagName("audio");//获取全部audio
    volume=param!=undefined?param:volume;
    if (volume) {//当前音量开启状态，则关闭音量
        for (let i = 0; i < audios.length; i++) {
            audios[i].volume=0;//将audio音量设置为0
        }
        volume=false;//设置标记
        document.getElementById("setvolume").value="音量X";
    }else{
        for (let i = 0; i < audios.length; i++) {
            audios[i].volume=1;//将audio音量设置为100
        }
        volume=true;//设置标记
        document.getElementById("setvolume").value="音量";
    }
}
//设置removeText的属性并刷新网页
function setRemoveText(param){
    if(param==null) param=!removeText;
    removeText=param;
    document.getElementById("removeText").value=removeText?"解析文件时清除上面的文本框√":"解析文件时清除上面的文本框×";
}